import json
import traceback

import pymysql
import requests


# 封装获取uuid的函数
def get_uuid():
    resp_verify = requests.get(url="http://kdtx-test.itheima.net/api/captchaImage")
    # 定义一个变量，用来接收提取uuid
    uuid = resp_verify.json().get("uuid")
    return uuid


# 封装公共断言的函数
def common_assert(resp, exp_status_code, exp_code, exp_msg):
    assert exp_status_code == resp.status_code
    assert exp_code == resp.json().get("code")
    assert exp_msg in resp.json().get("msg")


# 封装获取token的函数
def get_token(user="admin", pwd="HM_2023_test", code="2"):
    # 获取uuid
    uuid = get_uuid()
    header_dict_login = {"Content-Type": "application/json"}
    json_dict_login = {"username": user, "password": pwd, "code": code, "uuid": uuid}
    url_str_login = "http://kdtx-test.itheima.net/api/login"
    resp_login = requests.post(url=url_str_login, headers=header_dict_login, json=json_dict_login)
    token = resp_login.json().get("token")
    return token


# 定义变量，用来管理项目的路径
import os

base_path = os.path.dirname(__file__)


# 封装读取json文件的函数
def read_json(filename, apiname):
    file_path = base_path + "/data/{}.json".format(filename)
    # 1、获取指定文件中的所有测试数据
    with open(file_path, encoding='utf-8') as f:
        data = json.load(f)
        print(data)
    # 2、获取指定接口的测试数据
    data_list_dict = data.get(apiname)
    print("获取指定接口的测试数据：{}".format(data_list_dict))
    # 3、将获取列表嵌套字典的数据 转化成 列表嵌套元组的数据
    # 3.1 定义一个列表，用来存储列表嵌套元组的数据
    data_list_tuple = list()
    # 3.2 循环变量列表嵌套字典的数据，
    for data_dict in data_list_dict:
        # 3.3 获取每一个字典，将字典的值提取数据，放入元组中
        data_tuple = tuple(data_dict.values())
        # 3.4 将每一个元组，添加到新建的列表中
        data_list_tuple.append(data_tuple)
    # 3.5 返回列表嵌套元组的数据
    print("转化后列表嵌套元组的数据：{}".format(data_list_tuple))
    return data_list_tuple


# 封装操作数据库的函数
def exe_sql(sql_str):
    # 定义两个变量，用来接收数据库连接对象和游标对象
    con = None
    cur = None
    try:
        # 创建数据库连接对象
        con = pymysql.connect(host="211.103.136.244", user="student", password="KDTX_student_202304", port=7068,
                              database="huike", charset="utf8")
        # 创建游标对象
        cur = con.cursor()
        # 游标对象中执行SQL语句
        cur.execute(sql_str)
        # 如果是查询语句，返回全部查询结果
        if sql_str.split(" ")[0].lower() == "select":
            return cur.fetchall()
        # 如果是非查询语句
        else:
            # 数据库事务提交
            con.commit()
            # 返回受影响的函数
            return "受影响的行数：{}".format(cur.rowcount)
    except:
        # 报错信息收集
        traceback.print_exc()
        # 数据库事务的回滚
        if con is not None:
            con.rollback()
    finally:
        # 如果创建游标对象(con变量不为空)，关闭游标对象
        if cur is not None:
            cur.close()
        # 如果创建游标对象，关闭数据库连接对象
        if con is not None:
            con.close()


if __name__ == '__main__':
    course_id = 25
    # res = exe_sql("insert into tb_course (id,code,name,price) values({},'c01','python2022',2999);".format(course_id))
    res = exe_sql("select * from tb_course where id = {};".format(course_id))
    # res = exe_sql("delete from tb_course where id = {};".format(course_id))
    print(res)
